Swift中的協定使用protocol關鍵字來建立,其中可以宣告屬性與方法,其中屬性在具體實現時可以是計算屬性,也可以是儲存屬性。
protocol ProtocolNew {
// 定義實例屬性
// 可讀的
var name:String{get}
// 可讀可寫的
var age:Int {get set}
var nameAndAge: String{get}
// 定義靜態屬性
static var className:String{get}
}
// 建立一個類來遵守協定
class ClassNew:ProtocolNew {
// 進行協定中屬性的實現
var name:String
var age: Int
var nameAndAge: String{
get{
return "\(name) + \(age)"
}
}
static var className: String{
get{
return "MyClass"
}
}
init(){
name = "andy"
age = 23
}
}
需要注意的是,當協定中約定的屬性是可讀時,並非只讀的意思,他在實現中可以是只讀的,也可以是可讀可寫的,如果協定中約定的屬性為可讀可寫,則在實現時其必須是可讀可寫的。
// 定義一個協定
protocol ProtocolNewTwo {
// 宣告實例方法
func logName()
// 宣告靜態方法
static func logClassName()
}
// 遵守協定進行實現
class ClassNewTwo: ProtocolNewTwo {
var name:String
var age: Int
init(){
name = "andy"
age = 23
}
func logName() {
print(name)
}
static func logClassName() {
print("ClassNewTwo")
}
}
協定中雖然沒有任何屬性和方法的實現,但在很多應用場景中,其在語法上和普通資料型態有著相似的結構。
protocol MyProtocol {
// 定義實例屬性
var name:String{get}
var age:Int {get set}
var nameAndAge: String{get}
static var className:String{get}
func logName()
static func logClassName()
}
// 將協定類型作為參數
func test(param: MyProtocol) {
param.logName()
}
協定也可以作為某一個集合的元素類型,其意義是集合中所有的元素都要遵守此協定。
var array:Array<MyProtocol>
協定和class擁有相同的繼承語法。
// 定義一個協定
protocol ProtocolNewTwo {
// 宣告實例方法
func logName()
// 宣告靜態方法
static func logClassName()
}
protocol SubProtocol: ProtocolNewTwo {
// 此協定自動繼承協定中的約定方法
}
協定可以被class、struct等遵守,如果開發者需要使某個協定只能被class遵守,可以用class關鍵字來修飾。
protocol ClassProtocol: class {
// 此協定只能被class遵守
}
由於協定可以繼承,因此協定也可以使用is as! 等關鍵字進行檢查與轉換。
接下來,是Any與AnyObject的介紹